package Yanxin.atguigu.yx.util;

import Yanxin.atguigu.yx.common.Constant;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.util.List;

public class DimUtil {

    public static JSONObject readDim(Jedis redisClient,
                                     DruidPooledConnection phoenixConn,
                                     String table,
                                     String id) {

        //由于使用了redis作为外部缓存，为了保证数据是最新的，优先读取缓存
        JSONObject dim = DimUtil.readDimFromRedis(redisClient, table, id);

        if (dim==null){
            //redis没数据,读phoenix，并且加载到redis中
            System.out.println("友好提示：您查询的表没有在缓存中，去hbase的表： " +table + " " + id );
            dim = readDimFromPhoenix(phoenixConn,table,id);
            
            writeDimToRedis(redisClient,table,id,dim);
        }else {
            System.out.println("读取缓存： " + table + " " + id);
        }
        
        return dim;
    }

    private static void writeDimToRedis(Jedis redisClient, String table, String id, JSONObject dim) {

        String key = table + ":" + id; //表和id作为key
        String value = dim.toJSONString(); //对应的表内容作为value 存进redis

        /*redisClient.set(key, value);
        redisClient.expire(key,); */ // 设置ttl

        redisClient.setex(key, Constant.TWO_DAY_SECOND, value);
    }

    private static JSONObject readDimFromPhoenix(DruidPooledConnection phoenixConn,
                                                 String table,
                                                 String id) {

        String sql = " select * from " + table + " where id =? ";

        String[] args = {id} ;

        //这个方法给占位符?赋值
        List<JSONObject> list = JdbcUtil.queryList(phoenixConn,sql,args,JSONObject.class);

        //当前的方法就只有一行数据
        return list.get(0);

    }

    private static JSONObject readDimFromRedis(Jedis redisClient,
                                               String table,
                                               String id) {

        //传入要查询的表
        String key = table + ":" + id;
        String json = redisClient.get(key);

        //存在该表
        if (json!=null){
            return JSON.parseObject(json);
        }

        return null;
    }
}

/*
redis中数据类型的选择

string
 key         string
 表名+id     {json格式字符串}

 好处:
    读写方便
  坏处:
    key比较多, 一个id占用一个key

    解决:
        专门放入一个库中


     会给key添加ttl,


     每个key可以单独设置ttl


list
   key    value

   表名   {json格式字符串}, {...}, {....}

   好处: 可以只有6个
   坏处: 写比较方便 读不行. 需要变量list

set



hash
 key      field    value
 表名      id      json'格式字符串


 好处:
    key只有6个
    读写方便

 坏处:

    没有办法单独给每个维度设置ttl

zset

 */
